package com.ruoyi.datastatistics.Agreement;
//
// import com.ruoyi.common.utils.StringUtils;
// import com.ruoyi.datastatistics.domain.createcommand.PresetCommandDataInfo;
// import org.apache.commons.codec.binary.Hex;
// import org.apache.commons.collections4.CollectionUtils;
//
// import java.nio.ByteBuffer;
// import java.nio.ByteOrder;
// import java.nio.charset.StandardCharsets;
// import java.time.LocalDateTime;
// import java.time.Year;
// import java.time.format.DateTimeFormatter;
// import java.util.ArrayList;
// import java.util.Arrays;
// import java.util.List;
//
/**
 * 德高电磁水表下发命令包装类
 * 由C♯代码转译
 *
 * @author TsingYu
 * @date 2025年1月11日08点29分
 */
public class DeGaoNettyCommand {
//     public static final byte[] DTU_TYPE2 = {0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f};
//
//     public static byte[] getTerminalParamsInfoBytes(List<PresetCommandDataInfo> commandDatas, String terminalAddress) {
//         byte[] bit = null;
//         if (CollectionUtils.isNotEmpty(commandDatas)) {
//             bit = new byte[commandDatas.size() + 20];
//             bit[0] = 0x68;
//             bit[1] = (byte) (bit.length % 100);
//             bit[2] = (byte) (bit.length / 100);
//             bit[3] = 0x71;
//             bit[4] = (byte) 0x90;
//             byte[] temp = getByte(null, Integer.parseInt(terminalAddress), 4);
//             System.arraycopy(temp, 0, bit, 5, 4);
//             bit[9] = (byte) 0x91;
//             temp = getLongByte(null, Long.parseLong(LocalDateTime.now().format(DateTimeFormatter.ofPattern("ssmmHHddMMyy"))), 6);
//             System.arraycopy(temp, 0, bit, 10, 6);
//             bit[16] = 0x00;
//             bit[17] = (byte) commandDatas.size();
//             int i = 18;
//             for (PresetCommandDataInfo item : commandDatas) {
//                 bit[i] = (byte) Integer.parseInt(item.getTag().substring(4));
//                 i++;
//             }
//             bit[i++] = checkSum(bit);
//             bit[i] = 0x16;
//         }
//         return bit;
//     }
//
//     /**
//      * 多参数写命令
//      */
//     public static byte[] setTerminalParamsInfoBytes(List<PresetCommandDataInfo> commandDatas, String terminalAddress) {
//         byte[] bit;
//         byte[] tagDatas = new byte[0];
//         if (CollectionUtils.isNotEmpty(commandDatas)) {
//             for (PresetCommandDataInfo item : commandDatas) {
//                 byte[] tagData = getWriteByteByTag(item.getTag(), item.getContent());
//                 byte[] toolArray = new byte[tagData.length + tagDatas.length];
//                 System.arraycopy(tagDatas, 0, toolArray, 0, tagDatas.length);
//                 System.arraycopy(tagData, 0, toolArray, tagDatas.length, tagData.length);
//                 tagDatas = toolArray;
//             }
//         }
//         bit = new byte[20 + tagDatas.length];
//         bit[0] = 0x68;
//         bit[1] = (byte) (bit.length % 100);
//         bit[2] = (byte) (bit.length / 100);
//         bit[3] = 0x71;
//         bit[4] = (byte) 0x90;
//         byte[] temp = getByte(null, Integer.parseInt(terminalAddress), 4);
//         System.arraycopy(temp, 0, bit, 5, 4);
//         bit[9] = (byte) 0x91;
//         temp = getLongByte(null, Long.parseLong(LocalDateTime.now().format(DateTimeFormatter.ofPattern("ssmmHHddMMyy"))), 6);
//         System.arraycopy(temp, 0, bit, 10, 6);
//         bit[16] = 0x01;
//         bit[17] = (byte) commandDatas.size();
//         System.arraycopy(tagDatas, 0, bit, 18, tagDatas.length);
//         bit[tagDatas.length + 18] = checkSum(bit);
//         bit[tagDatas.length + 19] = 0x16;
//         return bit;
//     }
//
//     /**
//      * 初步解析软件客户端发过来的数据
//      */
//     // public static boolean getCsForAllType(byte[] bit, int index, byte[] type) {
//     //     boolean flag = true;
//     //     if (bit != null && bit.length > 0) {
//     //         int receivedLen = bit[1] & 0xFF;
//     //         int receivedLen2 = bit[2] & 0xFF;
//     //         receivedLen = receivedLen2 * 100 + receivedLen;
//     //         if (type.length > 0) {
//     //             boolean temp = false;
//     //             for (byte b : type) {
//     //                 if (bit[index] == b) {
//     //                     temp = true;
//     //                     break;
//     //                 }
//     //             }
//     //             flag = temp;
//     //         }
//     //         if (flag) {
//     //             if (bit[0] != 104) {
//     //                 flag = false;
//     //             } else if (receivedLen != bit.length) {
//     //                 flag = false;
//     //             } else if (bit[(bit.length - 1)] != 22) {
//     //                 flag = false;
//     //             } else if (bit[3] != 114) {
//     //                 flag = false;
//     //             } else {
//     //                 byte[] temp1 = new byte[bit.length - 2];
//     //                 System.arraycopy(bit, 0, temp1, 0, temp1.length);
//     //                 byte temp = checkSum(temp1);
//     //                 if (temp != bit[(bit.length - 2)]) {
//     //                     flag = false;
//     //                 }
//     //             }
//     //         }
//     //
//     //
//     //     }
//     //
//     //     return flag;
//     // }
//
//
//     /**
//      * @param mark
//      * @param ad
//      * @param ws
//      * @return
//      */
//     public static byte[] getByte(String mark, int ad, int ws) {
//         byte[] bit = new byte[4];
//         StringBuilder adTemp = new StringBuilder(Integer.toString(ad));
//         int length = ws * 2 - adTemp.length();
//
//         // 左侧填充零
//         for (int i = 0; i < length; i++) {
//             adTemp.insert(0, "0");
//         }
//
//         // 如果标记不为 null，则将其转换为字节并存储在 bit[0] 中
//         if (mark != null) {
//             bit[0] = (byte) Integer.parseInt(mark, 16);
//         }
//
//         // 解析地址并填充字节数组
//         for (int i = 0; i < ws; i++) {
//             int index = i * 2;
//             String temp = adTemp.substring(index, index + 2);
//             if (mark != null) {
//                 bit[i + 1] = (byte) Integer.parseInt(temp, 16);
//             } else {
//                 bit[i] = (byte) Integer.parseInt(temp, 16);
//             }
//         }
//
//         return bit;
//     }
//
//     /**
//      * 校验和
//      */
//     private static byte checkSum(byte[] bit) {
//         int sum = 0;
//         if (bit.length > 0) {
//             for (byte b : bit) {
//                 sum = sum + b;
//                 sum = sum & 0xFF;
//             }
//         }
//         return (byte) sum;
//     }
//
//     public static byte[] getLongByte(String mark, long ad, int ws) {
//         byte[] bit = new byte[ws];
//         StringBuilder adTemp = new StringBuilder(String.valueOf(ad));
//         int length = ws * 2 - adTemp.length();
//         for (int i = 0; i < length; i++) {
//             adTemp.insert(0, "0");
//         }
//         if (mark != null) {
//             bit[0] = (byte) Integer.parseInt(mark, 16);
//         }
//         for (int i = 0; i < ws; i++) {
//             int index = i * 2;
//             String temp = adTemp.substring(index, index + 2);
//             if (mark != null) {
//                 bit[i + 1] = (byte) Integer.parseInt(temp, 16);
//             } else {
//                 bit[i] = (byte) Integer.parseInt(temp, 16);
//             }
//
//         }
//
//         return bit;
//     }
//
//     public static byte[] getWriteByteByTag(String tag, Object data) {
//         byte[] bit = null;
//         if (tag != null) {
//             switch (tag) {
//                 case "TAG_1":
//                     bit = new byte[13];
//                     bit[0] = 0x01;
//                     byte[] tag1 = hexStringToByteArray(data.toString(), 12);
//                     System.arraycopy(tag1, 0, bit, 1, 12);
//                     break;
//                 case "TAG_2":
//                     bit = new byte[13];
//                     bit[0] = 0x02;
//                     byte[] tag2 = hexStringToByteArray(data.toString(), 12);
//                     System.arraycopy(tag2, 0, bit, 1, 12);
//                     break;
//                 case "TAG_3":
//                     bit = asciiStringToFixedLengthByteArray(data.toString(), 21, (byte) 3);
//                     break;
//                 case "TAG_4":
//                     bit = new byte[2];
//                     bit[0] = 0x04;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 case "TAG_5":
//                     bit = new byte[2];
//                     bit[0] = 0x05;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 case "TAG_6":
//                     bit = new byte[35];
//                     String[] datas = data.toString().split(",");
//                     String ip = datas[1].split(":")[1];
//                     short port = Short.parseShort(datas[3].split(":")[1]);
//                     byte ipType = (byte) Integer.parseInt(datas[2].split(":")[1]);
//                     byte[] portBit = shortToByteArray(port);
//                     if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                         reverse(portBit);
//                     }
//                     byte[] ipBit = asciiStringToFixedLengthByteArray(ip, 31, (byte) 0);
//                     bit[0] = 0x06;
//                     bit[1] = (byte) Integer.parseInt(datas[0].split(":")[1]);
//                     System.arraycopy(ipBit, 1, bit, 2, 30);
//                     bit[32] = portBit[0];
//                     bit[33] = portBit[1];
//                     bit[34] = ipType;
//                     break;
//                 case "TAG_7":
//                     bit = new byte[3];
//                     bit[0] = 0x07;
//                     byte[] temp1 = shortToByteArray(Short.parseShort(data.toString()));
//                     if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                         reverse(temp1);
//                     }
//                     System.arraycopy(temp1, 0, bit, 1, 2);
//                     break;
//                 case "TAG_8":
//                     bit = new byte[3];
//                     bit[0] = 0x08;
//                     byte[] temp2 = shortToByteArray(Short.parseShort(data.toString()));
//                     if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                         reverse(temp2);
//                     }
//                     System.arraycopy(temp2, 0, bit, 1, 2);
//                     break;
//                 case "TAG_9":
//                     bit = new byte[2];
//                     bit[0] = 0x09;
//                     bit[1] = 0x01;
//                     break;
//                 case "TAG_10":
//                     bit = new byte[2];
//                     bit[0] = 0x0A;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 case "TAG_11":
//                     bit = asciiStringToFixedLengthByteArray(data.toString(), 31, (byte) 11);
//                     break;
//                 case "TAG_12":
//                     bit = new byte[2];
//                     bit[0] = 0x0C;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 case "TAG_13":
//                     bit = new byte[2];
//                     bit[0] = 0x0D;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 case "TAG_14":
//                     bit = new byte[2];
//                     bit[0] = 0x0E;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 case "TAG_15":
//                     bit = new byte[9];
//                     bit[0] = 0x0F;
//                     byte[] startTime = getLongByte(null, Long.parseLong(data.toString().substring(0, 8)), 4);
//                     byte[] endTime = getLongByte(null, Long.parseLong(data.toString().substring(8, 16)), 4);
//                     System.arraycopy(startTime, 0, bit, 1, 4);
//                     System.arraycopy(endTime, 0, bit, 5, 4);
//                     break;
//                 case "TAG_16":
//                     bit = new byte[50];
//                     String[] tag16Datas = data.toString().split(",");
//                     String fileName = tag16Datas[0].split(":")[1];
//                     int lengthBefore = Integer.parseInt(tag16Datas[1].split(":")[1]);
//                     int lengthAfter = Integer.parseInt(tag16Datas[2].split(":")[1]);
//                     byte checksum = (byte) Integer.parseInt(tag16Datas[3].split(":")[1]);
//                     byte[] fileNameBit = asciiStringToFixedLengthByteArray(fileName, 41, (byte) 16);
//                     byte[] lengthBeforeBit = intToByteArray(lengthBefore);
//                     byte[] lengthAfterBit = intToByteArray(lengthAfter);
//                     if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                         reverse(lengthBeforeBit);
//                         reverse(lengthAfterBit);
//                     }
//                     System.arraycopy(fileNameBit, 0, bit, 0, 41);
//                     System.arraycopy(lengthBeforeBit, 0, bit, 41, 4);
//                     System.arraycopy(lengthAfterBit, 0, bit, 45, 4);
//                     bit[49] = checksum;
//                     break;
//                 case "TAG_17":
//                     bit = new byte[2];
//                     bit[0] = 0x11;
//                     bit[1] = 0x01;
//                     break;
//                 case "TAG_18":
//                     bit = new byte[2];
//                     bit[0] = 0x12;
//                     bit[1] = (byte) Integer.parseInt(data.toString());
//                     break;
//                 default:
//                     bit = new byte[0];
//                     break;
//             }
//         }
//         return bit;
//     }
//
//
//     /**
//      * 16进制字符转byte[]不足length补零
//      *
//      * @param hexString     16进制字符串
//      * @param desiredLength byte[]长度
//      * @return byte[]
//      */
//     public static byte[] hexStringToByteArray(String hexString, int desiredLength) {
//         byte[] bit = new byte[desiredLength];
//         hexString = hexString.replaceAll(" ", "");
//         if ((hexString.length() % 2) != 0) {
//             hexString = "0" + hexString;
//         }
//         byte[] returnBytes = new byte[hexString.length() / 2];
//         for (int i = 0; i < returnBytes.length; i++) {
//             returnBytes[i] = (byte) Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16);
//         }
//
//         System.arraycopy(returnBytes, 0, bit, 0, returnBytes.length);
//         return bit;
//     }
//
//     /**
//      * ascii转byte[]不足length补零并设置首位
//      *
//      * @param asciiString ascii
//      * @param fixedLength byte[]长度
//      * @param firstByte   首位标志位
//      * @return byte[]
//      */
//     public static byte[] asciiStringToFixedLengthByteArray(String asciiString, int fixedLength, byte firstByte) {
//         byte[] byteArray = new byte[fixedLength];
//         // 设置首位标志位
//         byteArray[0] = firstByte;
//         char[] asciiStringArray = asciiString.toCharArray();
//         for (int i = 1; i < asciiString.length() + 1 && i < fixedLength; i++) {
//             byteArray[i] = (byte) asciiStringArray[i - 1];
//         }
//         return byteArray;
//     }
//
//     /**
//      * short转字节数组（返回小端字节序）
//      *
//      * @param value short
//      * @return 字节数组
//      */
//     public static byte[] shortToByteArray(short value) {
//         return new byte[]{
//                 // 低位字节
//                 (byte) (value & 0xFF),
//                 // 高位字节
//                 (byte) ((value >> 8) & 0xFF)
//         };
//     }
//
//     /**
//      * int转字节数组（返回小端字节序）
//      *
//      * @param value int
//      * @return 字节数组
//      */
//     public static byte[] intToByteArray(int value) {
//         return new byte[]{
//                 // 低位字节
//                 (byte) (value & 0xFF),
//                 (byte) ((value >> 8) & 0xFF),
//                 (byte) ((value >> 16) & 0xFF),
//                 // 高位字节
//                 (byte) ((value >> 24) & 0xFF)
//         };
//     }
//
//     /**
//      * 多参数读取递归解析
//      */
//     public static List<PresetCommandDataInfo> recursiveParseReadParam(byte[] bit, List<PresetCommandDataInfo> list) {
//         PresetCommandDataInfo presetCommandData = new PresetCommandDataInfo();
//         String tag = "";
//         Object content = "";
//         switch (bit[0]) {
//             case 1:
//                 byte[] tag1 = new byte[12];
//                 System.arraycopy(bit, 1, tag1, 0, 12);
//                 tag = "TAG_1";
//                 content = Hex.encodeHexString(tag1);
//                 bit = Arrays.copyOfRange(bit, 13, bit.length);
//                 break;
//             case 2:
//                 byte[] tag2 = new byte[12];
//                 System.arraycopy(bit, 1, tag2, 0, 12);
//                 tag = "TAG_2";
//                 content = Hex.encodeHexString(tag2);
//                 bit = Arrays.copyOfRange(bit, 13, bit.length);
//                 break;
//             case 3:
//                 byte[] tag3 = new byte[20];
//                 System.arraycopy(bit, 1, tag3, 0, 20);
//                 tag = "TAG_3";
//                 content = new String(tag3, StandardCharsets.US_ASCII).replace("\u0000", "");
//                 bit = Arrays.copyOfRange(bit, 21, bit.length);
//                 break;
//             case 4:
//                 tag = "TAG_4";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             case 5:
//                 tag = "TAG_5";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             case 6:
//                 byte[] ipBit = new byte[30];
//                 byte[] portBit = new byte[2];
//                 System.arraycopy(bit, 2, ipBit, 0, 30);
//                 System.arraycopy(bit, 32, portBit, 0, 2);
//                 String ip = new String(ipBit, StandardCharsets.US_ASCII).replace("\u0000", "");
//                 // 检查当前系统的字节序（Java 默认使用大端字节序）
//                 if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                     // 如果是小端序，反转字节数组
//                     reverse(portBit);
//                 }
//                 // 将字节数组转换为短整数（16 位）
//                 short port = ByteBuffer.wrap(portBit).getShort();
//                 tag = "TAG_6";
//                 content = "中心号:" + (bit[1] == 0 ? "主中心" : "副中心") + ",IP地址:" + ip + ",IP类型:" + (bit[34] == 0 ? "TCP" : "UDP") + ",端口号:" + port;
//                 bit = Arrays.copyOfRange(bit, 35, bit.length);
//                 break;
//             case 7:
//                 byte[] tag7 = new byte[2];
//                 tag = "TAG_7";
//                 System.arraycopy(bit, 1, tag7, 0, 2);
//                 if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                     reverse(tag7);
//                 }
//                 content = ByteBuffer.wrap(tag7).getShort();
//                 bit = Arrays.copyOfRange(bit, 3, bit.length);
//                 break;
//             case 8:
//                 byte[] tag8 = new byte[2];
//                 tag = "TAG_8";
//                 System.arraycopy(bit, 1, tag8, 0, 2);
//                 if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
//                     reverse(tag8);
//                 }
//                 content = ByteBuffer.wrap(tag8).getShort();
//                 bit = Arrays.copyOfRange(bit, 3, bit.length);
//                 break;
//             case 10:
//                 tag = "TAG_10";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             case 11:
//                 byte[] tag11 = new byte[30];
//                 System.arraycopy(bit, 1, tag11, 0, 30);
//                 tag = "TAG_11";
//                 content = new String(tag11, StandardCharsets.US_ASCII).replace("\u0000", "");
//                 bit = Arrays.copyOfRange(bit, 31, bit.length);
//                 break;
//             case 12:
//                 tag = "TAG_12";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             case 13:
//                 tag = "TAG_13";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             case 14:
//                 tag = "TAG_14";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             case 18:
//                 tag = "TAG_18";
//                 content = bit[1];
//                 bit = Arrays.copyOfRange(bit, 2, bit.length);
//                 break;
//             default:
//                 break;
//         }
//         presetCommandData.setTag(tag);
//         presetCommandData.setContent(content);
//         list.add(presetCommandData);
//         if (bit.length == 0) {
//             return list;
//         }
//         return recursiveParseReadParam(bit, list);
//     }
//
//     /**
//      * 反转字节数组的方法
//      */
//     private static void reverse(byte[] array) {
//         int left = 0;
//         int right = array.length - 1;
//         while (left < right) {
//             byte temp = array[left];
//             array[left] = array[right];
//             array[right] = temp;
//             left++;
//             right--;
//         }
//     }
//
//
//     public static byte[] getTerminalDsDateInfoBytes(String oldAddr, String date) {
//         byte[] bit = null;
//         if (date.length() == 4) {
//             date = Year.now().format(DateTimeFormatter.ofPattern("yy")) + date;
//         }
//         if (StringUtils.isNotBlank(oldAddr)) {
//             // 68 16 00 71 20 00 00 00 01 21 00 00 00 02 33 16
//             bit = new byte[15];
//             bit[0] = 0x68;
//             bit[1] = 0x15;
//             bit[2] = 0;
//             bit[3] = 0x71;
//             bit[4] = DTU_TYPE2[0];
//             byte[] temp = getByte(null, Integer.parseInt(oldAddr), 4);
//             System.arraycopy(temp, 0, bit, 5, 4);
//             bit[9] = DTU_TYPE2[15];
//             // 日期
//             temp = getByte(null, Integer.parseInt(date), 3);
//             System.arraycopy(temp, 0, bit, 10, 3);
//             bit[13] = checkSum(bit);
//             bit[14] = 0x16;
//         }
//         return bit;
//     }
//
//
//     public static List<PresetCommandDataInfo> parseReadParam(byte[] data) {
//         List<PresetCommandDataInfo> list = new ArrayList<>();
//         if (data.length > 0) {
//             list = recursiveParseReadParam(data, list);
//         }
//         return list;
//     }
}
